package com.example.liuke.guangguang.ui;

import android.app.AlarmManager;
import android.app.PendingIntent;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;

import com.example.liuke.guangguang.MainActivity;
import com.example.liuke.guangguang.R;

import java.util.Calendar;

import static android.app.AlarmManager.RTC_WAKEUP;

public class timeActivity extends AppCompatActivity {
    private static final int INTERVAL = 1000 * 60 * 60 * 24;//这里设置一天的间隔时间，24小时

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_time);
        Intent intent = new Intent(this, MainActivity.class);
        //PendingIntent sender = PendingIntent.getBroadcast(context,
                //REQUEST_CODE, intent, PendingIntent.FLAG_CANCEL_CURRENT);

        //  其中第一个和第三个参数比较的重要，其次是第二个和第四个。第一个参数传入当前的context,第三个参数传入intent.
        //  PendingIntent是一个特殊的Intent，主要区别是intent是立马执行，PendingIntent是待确定的Intent。PendingIntent的操作实际上是传入的intent的操作
        //  获取PendingIntent对象  
        //  requestCode 参数用来区分不同的PendingIntent对象  
        //  getActivity(Context context, int requestCode,Intent intent, @Flags int flags)
        //  flag 参数常用的有4个值：  
        //  FLAG_CANCEL_CURRENT:如果当前系统中已经存在一个相同的PendingIntent对象，那么就将先将已有的PendingIntent取消，然后重新生成一个PendingIntent对象。
        //  FLAG_NO_CREATE:如果当前系统中不存在相同的PendingIntent对象，系统将不会创建该PendingIntent对象而是直接返回null。
        //  FLAG_ONE_SHOT:该PendingIntent只作用一次。在该PendingIntent对象通过send()方法触发过后，PendingIntent将自动调用cancel()进行销毁，那么如果你再调用send()方法的话，系统将会返回一个SendIntentException。
        //  FLAG_UPDATE_CURRENT:如果系统中有一个和你描述的PendingIntent对等的PendingInent，那么系统将使用该PendingIntent对象，但是会使用新的Intent来更新之前PendingIntent中的Intent对象数据，例如更新Intent中的Extras。   
        //  同，那么当前存在的PendingIntent对象不会被取消，而是重新加载新的Intent附加的数据  ,跟新数据剋有用这个

        PendingIntent sender = PendingIntent.getActivity(this,0,intent,PendingIntent.FLAG_CANCEL_CURRENT);

        AlarmManager am = (AlarmManager) this.getSystemService(Context.ALARM_SERVICE);

        Calendar calendar = Calendar.getInstance();
        //这里是设置每日的时间
        //这里要注意导报的设置 android里的calendar有api24的限制，所以用java里的包
        calendar.set(Calendar.HOUR_OF_DAY, 23);//21：30：10：0

        calendar.set(Calendar.MINUTE, 27);//设置月日，然后时间间隔，到时候提醒service 打开发送消息给activity 去销毁视图，去取消计时器
        calendar.set(Calendar.SECOND, 0);
        calendar.set(Calendar.MILLISECOND, 0);

        /*    setRepeating(int type, long triggerAtMillis, long intervalMillis, PendingIntent operation)方法将会设置一个重复性的闹钟。
　　      比set方法多了一个间隔参数。
　　      type的类型是四种：
　　      ELAPSED_REALTIME, ELAPSED_REALTIME_WAKEUP, RTC, RTC_WAKEUP.
　　      区分的是时间标准和是否在睡眠状态下唤醒设备。*/

       /* AlarmManager的常用方法有三个：
     （1）set(int type，long startTime，PendingIntent pi)；
        该方法用于设置一次性闹钟，第一个参数表示闹钟类型，第二个参数表示闹钟执行时间，第三个参数表示闹钟响应动作。
     （2）setRepeating(int type，long startTime，long intervalTime，PendingIntent pi)；
        该方法用于设置重复闹钟，第一个参数表示闹钟类型，第二个参数表示闹钟首次执行时间，第三个参数表示闹钟两次执行的间隔时间，第三个参数表示闹钟响应动作。
     （3）setInexactRepeating（int type，long startTime，long intervalTime，PendingIntent pi）；
        该方法也用于设置重复闹钟，与第二个方法相似，不过其两个闹钟执行的间隔时间不是固定的而已。
        这里主要讲解第一种方法：
        set（int type，long startTime，PendingIntent pi)）方法里面有三个参数：
        type： 闹钟的类型，有五种：

        AlarmManager.ELAPSED_REALTIME表示闹钟在手机睡眠状态下不可用，该状态下闹钟使用相对时间（相对于系统启动开始）；
        AlarmManager.ELAPSED_REALTIME_WAKEUP表示闹钟在睡眠状态下会唤醒系统并执行提示功能，该状态下闹钟也使用相对时间；
        AlarmManager.RTC表示闹钟在睡眠状态下不可用，该状态下闹钟使用绝对时间，即当前系统时间（ 让定时任务的触发时间从1970年1月1日0点开始算起）；
        AlarmManager.RTC_WAKEUP表示闹钟在睡眠状态下会唤醒系统并执行提示功能，该状态下闹钟使用绝对时间，状态值为0；
        AlarmManager.POWER_OFF_WAKEUP表示闹钟在手机关机状态下也能正常进行提示功能，所以是5个状态中用的最多的状态之一，该状态下闹钟也是用绝对时间；不过本状态好像受SDK版本影响，某些版本并不支持；
        intervalTime：闹钟的第一次执行时间，以毫秒为单位，它必须和type相对应，比如type是AlarmManager.ELAPSED_REALTIME_WAKEUP类型，代表是使用的是相对时间，所以intervalTime必须也得是相对时间：
        SystemClock.elapsedRealtime()。


        SystemClock.elapsedRealtime()方法可以获取到系统开机至今所经历时间的毫秒数，
        System.currentTimeMillis()方法可以获取到1970年1月1日0点至今所经历时间的毫秒数*/

        /*在java中,生成当前的时间戳大致上有这么几种方法,分别是:
        一、System.currentTimeMillis(),它属于java.lang.System;
        二、Calendar.getInstance().getTimeInMillis(),它属于java.util.Calendar;
        三、new Date().getTime(),它属于java.util.Date;
        这三种方法各自运行100000所消耗的时间.
                运行速度上currentTimeMillis>getTime>getTimeInMillis.
                currentTimeMillis方法所消耗的时间:2  
        Calendar中的getTime()方法所消耗的时间:108  
        Date中的getTime方法所消耗的时间:6  */
        am.setRepeating(RTC_WAKEUP, calendar.getTimeInMillis(),
                INTERVAL, sender);

    }
}
